package CelcatCalendrier;

import com.google.gdata.client.calendar.*;
import com.google.gdata.data.DateTime;
import com.google.gdata.data.calendar.CalendarEntry;
import com.google.gdata.data.calendar.CalendarEventEntry;
import com.google.gdata.data.calendar.CalendarEventFeed;
import com.google.gdata.data.calendar.CalendarFeed;
import com.google.gdata.data.extensions.When;
import com.google.gdata.model.atom.Link;
import com.google.gdata.util.*;

import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * @author Yoann BRABAN
 *
 */
public class CelcatCalendrier {
	
	private CalendarService m_mesCalendriers;
	private static final String m_url = "https://www.google.com/calendar/feeds/default/allcalendars/full";
	private static URL m_feedUrl;
	private String m_login;
	
	/**
	 * Constructeur de la classe Calendrier
	 */
	public CelcatCalendrier(String p_login, String p_password){
		
		m_login = p_login;
		m_mesCalendriers = new CalendarService("Calendrier");
		
		
		try {
			// Tentative de connexion au compte
			m_mesCalendriers.setUserCredentials(p_login, p_password);			
		} catch (AuthenticationException e) {
			e.printStackTrace();
			
		} catch (ServiceException e) {
			e.printStackTrace();
			
		}
		
		// Cr�ation de l'url google agenda
		try {
			m_feedUrl = new URL(m_url);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}				
	}
	
    /**
     * 
     * @return la liste des calendriers associ�s au compte
     */
	public CalendarFeed f_rechercheCalendrier(){
		
		// Liste des calendriers de l'utilisateur
		CalendarFeed l_resultat = null;
		
		try {
			
			l_resultat = m_mesCalendriers.getFeed(m_feedUrl, CalendarFeed.class);
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return l_resultat;		
	}
	
	
	/**
	 * 
	 * @param c, le calendrier dont on souhaite lister les �v�nements
	 * @return, la liste des �v�nements du calendrier
	 */
	public CalendarEventFeed f_rechercheEvent(CalendarEntry p_entry, GregorianCalendar p_gc){
		
	
		CalendarEventFeed m_evenement =  null;
		// Envoie de la requete et on recupere la r�ponse
		try {
						
			// R�cup�re l'url contenant les �v�nements du calendrier
			URL feedUrl = new URL(p_entry.getLink("alternate", "application/atom+xml").getHref());
			CalendarQuery l_myQuery = new CalendarQuery(feedUrl);
			
			//Conversion du format de date
			DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			java.util.Date dateDate = p_gc.getTime();			
			DateTime l_dt = new DateTime();
			l_dt.setValue(p_gc.getTimeInMillis());
			// Date de d�but pour le filtrage
			l_myQuery.setMinimumStartTime(l_dt);
			
			// Ajout d'une ann�e
			p_gc.add(Calendar.YEAR, 1);
			dateDate = p_gc.getTime();			 
			l_dt.setValue(p_gc.getTimeInMillis());
			// Date de fin pour le filtrage
			l_myQuery.setMaximumStartTime(l_dt);

			// Enlever la limite de r�sultat
			l_myQuery.setMaxResults(Integer.MAX_VALUE);
			m_evenement = m_mesCalendriers.getFeed(l_myQuery, CalendarEventFeed.class);
			
			/*System.out.println("Mes Evenements:");
			System.out.println();
			for (int i = 0; i < m_evenement.getEntries().size(); i++) {
			  CalendarEventEntry entry = m_evenement.getEntries().get(i);
			  for (When w: entry.getTimes())
				  System.out.println("\t" + "\t" + entry.getTitle().getPlainText() + " D�but : " + w.getStartTime() + " Fin : " + w.getEndTime());
			}*/
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return m_evenement;
		
		
	}

}
